在 AndroidManifest 中加入
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
取得裝置精確的位置,為取得 GPS 定位的權限
取得裝置約略的位置,為取得網路定位的權限
在 MainActivity 中請求權限
關於 Permission 及請求權限的方式請參考 Day 3 內容
在下方彈出提醒訊息
要使用 Snackbar 需先在 build.gradle 中加入
implementation 'com.android.support:design:28.0.0'
基礎設定 SnackBar
Snackbar.make(view: View, text: CharSequence, duration: Int).show()
val thisView = window.decorView
Snackbar.make(thisView, "無定位功能無法執行程序", Snackbar.LENGTH_INDEFINITE).show()
window.decorView 在 Day 5 內容中有提過
make 方法:製造出 SnackBar
make (view: View, text: CharSequence, duration: Int)
view:parent view
SnackBar 是依附在 View 上的 view,因此需設置 parent view,
也因此 SnackBar 的顯示會跟著 parent view 同進退。
Toast 與 SnackBar 不同:
Toast 為依附在 context 上,因此即便 App 不在螢幕畫面中,
只要依附的 context 仍存在,Toast 仍會繼續彈出。
text:為要顯示的訊息內容
duration:SnackBar 顯示的時間,有三種
LENGTH_SHORT:短時間後自動關閉
LENGTH_LONG:長時間後自動關閉
LENGTH_INDEFINITE:一直顯示
當有新的不同內容的 SnackBar 出現時被替換會關閉
設置事件觸發 SnackBar 的 dismiss() 方法時會關閉
show():顯示呼叫此方法的物件
為 SnackBar 設置動作及按鈕
val snackBar = Snackbar.make(thisView, "無定位功能無法執行程序", Snackbar.LENGTH_INDEFINITE)
snackBar.setAction("OK", object : View.OnClickListener {
override fun onClick(v: View?) {
snackBar.dismiss()
}
})
.setActionTextColor(Color.LTGRAY)
.show()
setAction 方法:
setAction (text: CharSequence, listener: View.OnClickListener)
text:按鈕的文字內容
listener:按鈕 onClick 事件的 listener
dismiss():關閉呼叫此方法的物件
setActionTextColor 方法 :設置文字按鈕顏色
可自定義 SnackBar 外觀、樣式:參考資料
此方法會在 Google Map 準備好時被調用
因為我們要對地圖做的任何初始化設定都需在 Map 準備好時才能設定,
因此對地圖的初始化設定將會寫在此方法中
onMapReady 為 OnMapReadyCallback 這個 Interface 裡面的 abstract function
因為我們需要調用這個方法,所以我們必須實例化這個 Interface 並實作 onMapReady 方法。
從前面導入建立好的 Google Maps Activity 可以看到 Activity 實例化了這個 Interface
val mMap : GoogleMap
override fun onMapReady(googleMap: GoogleMap) {
//取得準備好的 Map
mMap = googleMap
//自定義的 function,用來判斷並確定要用哪種定位
//並且在起始位置加上 Marker
locationManager()
//Google Map 中顯示裝置位置,且裝置移動會跟著移動的那個藍點
mMap.isMyLocationEnabled = true
}
GoogleMap 的方法,用來加上標記
addMarker (options: MarkerOptions)
MarkerOptions:用來定義 Marker 如何呈現的物件類型
mMap.addMarker(MarkerOptions().position(lntLng).title("Current Position"))
MarkerOptions 中的方法:
position (latlng: LatLng):設置 Marker 的位置,latlng 為經緯度
title (title: String):設置 Marker 的標題,點擊 Marker 時會彈出小視窗顯示此內容
icon (iconDescriptor: BitmapDescriptor):設置 Marker 的樣式,無設置的話為預設樣式
更多方法請參考上方 MarkerOptions 連結
GoogleMap 的方法,用來設置 Map 的相機
animateCamera (update: CameraUpdate)
CameraUpdate:用來定義相機該如何變動的物件類型
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location.latitude, location.longitude), 12.0f))
用產生 CameraUpdate 類型物件的類別
newLatLng 方法:移動相機中心
newLatLng (latLng: LatLng )
newLatLngZoom 方法:移動相機中心及調整縮放級距
newLatLngZoom (latLng: LatLng, zoom: float)
latLng:新的相機中心的經緯度
zoom:相機移動後要呈現的縮放級距
更多的相機設定方法請參考上方 CameraUpdateFactory 的連結
用來取得系統定位服務
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager?
使用 Context 的 getSystemService 方法加入參數 LOCATION_SERVICE
獲取 LocationManager
用來確認定位服務是否可使用,會回傳 Boolean 值
(使用者在設定中設為開啟就會為 True,反之為 False)
isProviderEnabled (provider: String)
provider:定位服務提供者的名稱,如下
LocationManager.GPS_PROVIDER:GPS 定位服務
LocationManager.NETWORK_PROVIDER:網路定位服務
var isGPSEnabled = locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER)
var isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
用來註冊 LocationManager 要向哪個服務取得位置更新資訊
requestLocationUpdates (provider: String,
minTime: long,
minDistance: float,
listener: LocationListener)
provider:定位服務提供者的名稱
minTime:更新位置的最小時間間隔,單位為毫秒
minDistance:更新位置的最小距離間隔,單位為米
listener:每次位置更新的時候會從 LocationManager 接收通知的 LocationListener
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0f, locationListener)
用來獲取上一次紀錄的定位位置,會回傳上次紀錄的定位位置資訊
getLastKnownLocation (provider:String)
provider:定位服務提供者的名稱
在定位服務未開啟的時候也可執行此方法,會回傳 null
有可能得到過期的位置資訊
例如定位服務被開啟後關閉,接著裝置移動後又開啟的時候
val oriLocation : Location
oriLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
Android
Kotlin
Google Map
Google Map Marker
Google Map Camera
SnackBar
LocationManager